#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>

int main() {
    printf("[父进程] 启动，PID = %d\n", getpid());
    pid_t pid = fork();
    if (pid < 0) {
        // fork 失败
        fprintf(stderr, "创建子进程失败！\n");
        return 1;
    }
    else if (pid == 0) {
        // 子进程部分
        printf("[子进程] 已创建，PID = %d，将尝试执行命令...\n", getpid());

        // 使用 execlp 执行 ls -a,展示所有文件
        execlp("ls", "ls", "-a", NULL);

        // 如果 exec 成功，此处不运行
        perror("[子进程] exec 执行失败");
        exit(2);
    }
    else {
        // 父进程等待子进程结束
        int status;
        pid_t finished = waitpid(pid, &status, 0);

        if (finished == -1) {
            perror("[父进程] 等待子进程出错");
        } else {
            if (WIFEXITED(status)) {
                printf("[父进程] 子进程 %d 正常结束，退出码 = %d\n",
                       finished, WEXITSTATUS(status));
            } else if (WIFSIGNALED(status)) {
                printf("[父进程] 子进程 %d 被信号 %d 终止\n",
                       finished, WTERMSIG(status));
            } else {
                printf("[父进程] 子进程 %d 异常结束\n", finished);
            }
        }
        printf("[父进程] 所有工作完成，即将退出。\n");
    }
    return 0;
}